﻿using System;
using System.Runtime.Remoting.Messaging;
using OrionApplication.OrionLib;
using OrionApplication.OrionLib.Dao;
using OrionApplication.OrionLib.Orion;

namespace OrionApplication.OrionForm
{
    public partial class OrionConnexionForm : ComponentFactory.Krypton.Toolkit.KryptonForm
    {
        /// <summary>
        /// Inidque au programme si l'authentification est OK ou KO
        /// </summary>
        public Boolean cont = false;
        /// <summary>
        /// Nombre de tentative de connexion en cours
        /// </summary>
        private int NbTentative = 0;

        public OrionConnexionForm()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Vérifie que toutes les conditions du formulaire sont remplis pour le soumettre
        /// </summary>
        /// <returns>Si tout est OK true, false sinon</returns>
        private bool ValideForm()
        {
            // Champ Login de renseigné ?
            if (this.txtLogin.Text.Trim() == string.Empty)
            {
                OrionOutils.Alerte(OrionConfBase.ChampObligatoire, false);
                this.txtLogin.Focus();
                return false;
            }
            // Champ Password de renseigné ?
            if (this.txtPassword.Text.Trim() == string.Empty)
            {
                OrionOutils.Alerte(OrionConfBase.ChampObligatoire, false);
                this.txtPassword.Focus();
                return false;
            }
            return true;
        }

        /// <summary>
        /// Lance le processus de connexion
        /// </summary>
        private void LanceConnexion()
        {
            DaoOrionUser dao = new DaoOrionUser();
            // Si le formulaire est correctement rempli
            if (this.ValideForm())
            {
                // Nous incrémentons le nombre de tentative de connexion
                this.NbTentative++;
                try
                {
                    // Nous chargeons l'utilisateur avec le Login
                    OrionUser ou = dao.SelectByLogin(this.txtLogin.Text);
                    // Si le mot de passe est identique à celui en base
                    if (ou.Password == this.txtPassword.Text)
                    {
                        // Si l'utilisateur est actif
                        if (ou.OrionEtat)
                        {
                            // Nous sauvegardons l'utilisateur en mémoire pour améliorer les temps de réponses
                            CallContext.SetData(OrionConfBase.OrionUserConnected, ou);
                            // Nous allons faire de même avec le Groupe de l'utilisateur
                            DaoOrionGroup daoG = new DaoOrionGroup();
                            OrionGroup og = daoG.SelectById(ou.OrionGroupId);
                            CallContext.SetData(OrionConfBase.OrionUserGroupConnected, og);
                            // Nous allons sauvegarder le fait que ce soit un admin ou non
                            DaoOrionTable daoT = new DaoOrionTable();
                            OrionTable ot = daoT.SelectById(og.TypeId);
                            if(ot.Double1.Equals(1))
                                CallContext.SetData(OrionConfBase.OrionUserIsAdmin, true);
                            else
                                CallContext.SetData(OrionConfBase.OrionUserIsAdmin, false);
                            // Nous indiquons au programme que la connexion est OK
                            this.cont = true;
                            // Nous fermons le fenêtre connexion
                            this.Close();
                        }
                        // L'utilisateur est inactif
                        else
                        {
                            // Nous l'indiquons à l'écran
                            OrionOutils.Alerte(OrionConfBase.UtilisateurInactif, false);
                        }
                    }
                    // Le mot de passe ne correspond pas à celui enregistré en base
                    else
                    {
                        // Nous vidons le champ Password
                        this.txtPassword.Text = string.Empty;
                        // Nous indiquons l'erreur à l'écran
                        OrionOutils.Alerte(OrionConfBase.ErreurConnexion, false);
                        // Nous indiquons au programme que la connexion est KO
                        this.cont = false;
                        // Si le nombre de tentative de connexion est trop élevé
                        if (this.NbTentative.Equals(3))
                        {
                            // On ferme la fenêtre
                            this.Close();
                        }
                    }
                }
                catch (Exception ex)
                {
                    // En cas d'erreur non gérée, nous l'affichons
                    OrionOutils.Erreur("Erreur Critique", ex.Message, false);
                }
            }
        }

        private void btnValid_Click(object sender, EventArgs e)
        {
            LanceConnexion();
        }
        
        private void btnCancel_Click(object sender, EventArgs e)
        {
            // Nous indiquons au programme que la connexion est KO
            this.cont = false;
            // Nous fermons la fenêtre de connexion
            this.Close();
        }

        private void OrionConnexionForm_Activated(object sender, EventArgs e)
        {
            // Nous recherchons dans le fichier de connexion le mode de pré-chargement pour l'authentification
            string ModePreChargement = OrionOutils.GetValueFileConfiguration("ConnexionPreChargement");
            // Si le pré-chargement est correctement paramétré
            if (ModePreChargement != "FALSE" && ModePreChargement != string.Empty)
            {
                // Si pré-chargment par le login Windows
                if (ModePreChargement.ToUpper().Equals("WINDOWS"))
                {
                    this.txtLogin.Text = Environment.UserName;
                    this.ActiveControl = this.txtPassword;
                }
                // Si préchargement par paramétre
                else if (ModePreChargement.ToUpper().Equals("PARAM"))
                {
                    this.txtLogin.Text = OrionOutils.GetValueFileConfiguration("ConnexionPreChargementUser");
                    this.ActiveControl = this.txtPassword;
                }
                // Si connexion automatique par paramétre
                else if (ModePreChargement.ToUpper().Equals("AUTO"))
                {
                    this.txtLogin.Text = OrionOutils.GetValueFileConfiguration("ConnexionPreChargementUser");
                    this.txtPassword.Text = OrionOutils.GetValueFileConfiguration("ConnexionPreChargementMdp");
                    this.LanceConnexion();
                }
                // Sinon ce cas n'est pas géré
                else
                {
                    OrionOutils.Erreur("Erreur Critique", "Votre fichier de configuration fait référence à une valeur inconnue pour la clef \"ConnexionPreChargement\"", false);
                }
            }
            // Sinon le pré-chargement est désactivé ou l'option n'existe pas
            else
            {
                this.ActiveControl = this.txtLogin;
            }
        }
    }
}
